﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace System.Windows.Media.Media3D10
{
    /// <summary>
    /// Game time parameter
    /// </summary>
    public sealed class GameTimeParameter : EffectParameter
    {
        #region Data
        private const string g_time = "g_time";

        private SlimDX.Direct3D10.EffectScalarVariable _timeEffectVariable;
        #endregion

        #region EffectParameter Implementation
        /// <summary>
        /// En cas de substitution dans une classe dérivée, participe au dessin des objets dans le pipeline DirectX10
        /// </summary>
        /// <param name="context">Contexte de dessin.</param>
        /// <exception cref="ArgumentNullException">Soulevée si le contexte est null.</exception>
        protected override void OnDraw(DrawingContext context)
        {
            if (object.ReferenceEquals(context, null))
                throw new ArgumentNullException("context");

            _timeEffectVariable.Set(context.Time);
        }

        /// <summary>
        /// Appelé lors de l'initialisation de l'effet associé
        /// </summary>
        /// <param name="effect">Effet associé</param>
        protected override void  OnInitEffect(SlimDX.Direct3D10.Effect effect)
        {
 	         base.OnInitEffect(effect);
             if (!object.ReferenceEquals(effect, null))
                 this._timeEffectVariable = this.Effect.GetVariableByName(g_time).AsScalar();
        }
        #endregion

        #region Freezable Implementation
        /// <summary>
        /// Une fois implémentée dans une classe dérivée, initialise une nouvelle instance de la classe dérivée <see cref="Freezable"/>. 
        /// </summary>
        /// <returns>Nouvelle instance.</returns>
        protected override Freezable CreateInstanceCore()
        {
            return new GameTimeParameter();
        }
        #endregion
    }
}
